Skip to content

feat(react): add FeatureFlag component #1164

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 56 commits into
base: main
Choose a base branch
from

Conversation

weyert
Copy link
Contributor

@weyert weyert commented Apr 9, 2025

This PR

Introduces the FeatureFlag component for React that allow using feature flags in a declarative manner

Related Issues

No ticket

Notes

Maybe consider adding a similar component for other supported frameworks?

Follow-up Tasks

How to test

I have written unit tests to cover the main features of the component

@weyert weyert requested review from a team as code owners April 9, 2025 00:12
@weyert weyert force-pushed the add-feature-flag-component branch from b22a3e3 to e6614c0 Compare April 9, 2025 00:13
/**
* The key of the feature flag to evaluate.
*/
featureKey: string;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should be called key... or possibly flagKey, but I think that's redundant given the name of the component.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

key is reserved in React: https://react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key

Keys tell React which array item each component corresponds to, so that it can match them up later. This becomes important if your array items can move (e.g. due to sorting), get inserted, or get deleted. A well-chosen key helps React infer what exactly has happened, and make the correct updates to the DOM tree.

so I would vote for flagKey

featureKey: string;

/**
* Optional value to match against the feature flag value.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please specify here exactly what comparison is used\ (==vs ===, etc).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if we do the default mentioned below, we can just describe it as By default, strict equality is used

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added in the jsdoc comment

* If a boolean, it will check if the flag is enabled (true) or disabled (false).
* If a string, it will check if the flag variant equals this string.
*/
match?: string | boolean;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be really cool to add support for a predicate function that accepts the EvaluationDetails so people can specify exactly how to match.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be really cool to add support for a predicate function that accepts the EvaluationDetails so people can specify exactly how to match.

+1

Also with this, you could make this function work for all the types.
And it could have a default that would be

function equals<T>(expected: T, actual: EvaluationDetails<T>){
    return expected === actual.value
}

And for objects we could actually make this required if we wanted as this default does not make much sense here.
What do you think @weyert @toddbaert?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually ya, I think that's a great idea.

* Default value to use when the feature flag is not found.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
defaultValue: any;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can use the FlagValue type available from the SDK.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the predicate from above this could be generic.
The whole component would become nicely typed then as the same type param can be used for the predicate then, so it will always fit the default value.

* Can be a React node or a function that receives flag query details and returns a React node.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
children: React.ReactNode | ((details: FlagQuery<any>) => React.ReactNode);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/**
* Optional content to render when the feature flag condition is not met.
*/
fallback?: React.ReactNode;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if we are going to only have one alternative child (fallback) we definitely need to do this, so that users can have control over to render this in very specific situations (evaluation errors, reasons, etc).

The alternative (which I don't like as muich) would be to also specify error components, etc... but I think that isn't as good.

cc @beeme1mr @lukas-reining

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The alternative (which I don't like as muich) would be to also specify error components, etc... but I think that isn't as good.

I think for it feels a little more idiomatic to have the matcher that is also able to match for error, as you said @toddbaert.
But both could work for me.

/**
* If true, inverts the condition logic (renders children when condition is NOT met).
*/
negate?: boolean;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if this is needed if we do this: https://github.com/open-feature/js-sdk/pull/1164/files#r2036805701 I would recommend getting rid of this, then users can white their own invert.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

Copy link
Member

@toddbaert toddbaert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is really cool. I really like the idea and the concepts. I've made a few minor proposals that I think simply the API but also make it slightly more flexible.

Copy link
Member

@lukas-reining lukas-reining left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good idea!
Left some thought before approving :)

/**
* The key of the feature flag to evaluate.
*/
featureKey: string;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

key is reserved in React: https://react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key

Keys tell React which array item each component corresponds to, so that it can match them up later. This becomes important if your array items can move (e.g. due to sorting), get inserted, or get deleted. A well-chosen key helps React infer what exactly has happened, and make the correct updates to the DOM tree.

so I would vote for flagKey

* If a boolean, it will check if the flag is enabled (true) or disabled (false).
* If a string, it will check if the flag variant equals this string.
*/
match?: string | boolean;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be really cool to add support for a predicate function that accepts the EvaluationDetails so people can specify exactly how to match.

+1

Also with this, you could make this function work for all the types.
And it could have a default that would be

function equals<T>(expected: T, actual: EvaluationDetails<T>){
    return expected === actual.value
}

And for objects we could actually make this required if we wanted as this default does not make much sense here.
What do you think @weyert @toddbaert?

* Default value to use when the feature flag is not found.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
defaultValue: any;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the predicate from above this could be generic.
The whole component would become nicely typed then as the same type param can be used for the predicate then, so it will always fit the default value.

/**
* Optional content to render when the feature flag condition is not met.
*/
fallback?: React.ReactNode;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The alternative (which I don't like as muich) would be to also specify error components, etc... but I think that isn't as good.

I think for it feels a little more idiomatic to have the matcher that is also able to match for error, as you said @toddbaert.
But both could work for me.

/**
* If true, inverts the condition logic (renders children when condition is NOT met).
*/
negate?: boolean;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

featureKey: string;

/**
* Optional value to match against the feature flag value.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if we do the default mentioned below, we can just describe it as By default, strict equality is used

@beeme1mr
Copy link
Member

Hey @weyert, could you please respond to the feedback when you have a moment? It looks like this change is almost ready and it would be great to get it out soon.

@weyert
Copy link
Contributor Author

weyert commented Jul 19, 2025

Totally forgot about this PR. Having a look the coming days

weyert and others added 13 commits July 20, 2025 18:11
Introduces the FeatureFlag component for React that allow using
feature flags in a declarative manner

Signed-off-by: Weyert de Boer <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
## This PR

- adds an internal `use` polyfill
- refactors suspense support to maintain state across rerenders

### Notes

Previously, the Next.JS build process would timeout when using a
suspense flag hook. The reason for this is because the noop provider
(which is used during a build) is never ready. That meant that the
promise thrown to initiate suspense never resolved. To address this,
I've added global state using a weak map that's keyed off a provider. A
`useRef` won't help because the value is only retained if the component
renders successfully.

> [!NOTE]
> This unblocks suspense in our demo app but does not mean NextJS is
officially support (yet).

### How to test

I've added some tests and manually tested in the Toggle Shop.

---------

Signed-off-by: Michael Beemer <[email protected]>
Co-authored-by: Todd Baert <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
Fixes issue where nest test suite was running using dist not source of
server sdk.

Signed-off-by: Todd Baert <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[1.8.0](core-v1.7.2...core-v1.8.0)
(2025-04-10)

### ✨ New Features

* add support for abort controllers to event handlers
([#1151](#1151))
([6a22483](6a22483))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
Signed-off-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[0.0.11](angular-sdk-v0.0.10...angular-sdk-v0.0.11)
(2025-04-11)

### ✨ New Features

* **angular:** add option for initial context injection
([aafdb43](aafdb43))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Lukas Reining <[email protected]>
Co-authored-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@angular-eslint/builder](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2fbuilder/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fbuilder/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fbuilder/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fbuilder/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fbuilder/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin-template](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin-template/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin-template/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin-template/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin-template/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin-template/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/schematics](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2fschematics/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fschematics/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fschematics/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fschematics/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fschematics/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/template-parser](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2ftemplate-parser/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2ftemplate-parser/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2ftemplate-parser/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2ftemplate-parser/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2ftemplate-parser/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/builder)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

##### 🚀 Features

- update angular packages to the stable v19
([#&#8203;2120](https://redirect.github.com/angular-eslint/angular-eslint/pull/2120))

##### ❤️ Thank You

- Leosvel Pérez Espinosa
[@&#8203;leosvelperez](https://redirect.github.com/leosvelperez)

#### 18.4.3 (2024-11-29)

##### 🩹 Fixes

- yarn pnp issues
([#&#8203;2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.4.2 (2024-11-23)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.4.1 (2024-11-18)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.4.0 (2024-10-21)

##### 🚀 Features

- support ESM configs and .cjs and .mjs extensions
([#&#8203;2068](https://redirect.github.com/angular-eslint/angular-eslint/pull/2068))

##### 🩹 Fixes

- update dependency eslint to v9.13.0, support noConfigLookup
([#&#8203;2045](https://redirect.github.com/angular-eslint/angular-eslint/pull/2045))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.3.1 (2024-09-11)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.3.0 (2024-08-13)

##### 🩹 Fixes

-   ensure consistent nx dependency versions

##### ❤️ Thank You

-   James Henry

#### 18.2.0 (2024-07-31)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.1.0 (2024-07-01)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.0.1 (2024-05-30)

##### 🩹 Fixes

- move typescript-eslint packages to peerDeps, consistently allow v7 and
v8

##### ❤️ Thank You

-   James Henry

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🚀 Features

- **eslint-plugin:** add rule require-lifecycle-on-prototype
([#&#8203;2259](https://redirect.github.com/angular-eslint/angular-eslint/pull/2259))

##### 🩹 Fixes

- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

##### 🚀 Features

- **eslint-plugin:** prefer-signals now checks .asReadonly() calls
([#&#8203;2218](https://redirect.github.com/angular-eslint/angular-eslint/pull/2218))
- **eslint-plugin:** prefer-signals read-only suggestion is now a fix
([#&#8203;2175](https://redirect.github.com/angular-eslint/angular-eslint/pull/2175))

##### 🩹 Fixes

- **eslint-plugin:** \[no-input-prefix] false positive on input
initializer value
([#&#8203;2184](https://redirect.github.com/angular-eslint/angular-eslint/pull/2184))
- **eslint-plugin:** \[prefer-signals] support linkedSignal
([#&#8203;2213](https://redirect.github.com/angular-eslint/angular-eslint/pull/2213))

##### ❤️ Thank You

- Cédric Exbrayat
[@&#8203;cexbrayat](https://redirect.github.com/cexbrayat)
-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
-   Lucas Neto Moreira

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-standalone] error range should only
include property and value
([#&#8203;2172](https://redirect.github.com/angular-eslint/angular-eslint/pull/2172))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

##### 🩹 Fixes

- **eslint-plugin:** adding prefer-signals rule to exported config
([#&#8203;2150](https://redirect.github.com/angular-eslint/angular-eslint/pull/2150))

##### ❤️ Thank You

- Quentin Deroubaix
[@&#8203;quentinderoubaix](https://redirect.github.com/quentinderoubaix)

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

##### 🚀 Features

- ⚠️ **eslint-plugin:** promote prefer-standalone to recommended
([8dfdc4f4](https://redirect.github.com/angular-eslint/angular-eslint/commit/8dfdc4f4))
- **eslint-plugin:** new rule prefer-signals
([#&#8203;1872](https://redirect.github.com/angular-eslint/angular-eslint/pull/1872))
- ⚠️ **eslint-plugin:** remove deprecated no-host-metadata-property rule
([#&#8203;2113](https://redirect.github.com/angular-eslint/angular-eslint/pull/2113))
- ⚠️ **eslint-plugin:** remove deprecated sort-ngmodule-metadata-arrays
rule
([#&#8203;2114](https://redirect.github.com/angular-eslint/angular-eslint/pull/2114))
- ⚠️ **eslint-plugin:** prefer-standalone recognizes that standalone is
the default
([#&#8203;2096](https://redirect.github.com/angular-eslint/angular-eslint/pull/2096))
- ⚠️ **eslint-plugin:** remove deprecated prefer-standalone-component
rule
([#&#8203;2112](https://redirect.github.com/angular-eslint/angular-eslint/pull/2112))

##### ⚠️ Breaking Changes

- ⚠️ **eslint-plugin:** promote prefer-standalone to recommended
([8dfdc4f4](https://redirect.github.com/angular-eslint/angular-eslint/commit/8dfdc4f4))
- ⚠️ **eslint-plugin:** remove deprecated no-host-metadata-property rule
([#&#8203;2113](https://redirect.github.com/angular-eslint/angular-eslint/pull/2113))
- ⚠️ **eslint-plugin:** remove deprecated sort-ngmodule-metadata-arrays
rule
([#&#8203;2114](https://redirect.github.com/angular-eslint/angular-eslint/pull/2114))
- ⚠️ **eslint-plugin:** prefer-standalone recognizes that standalone is
the default
([#&#8203;2096](https://redirect.github.com/angular-eslint/angular-eslint/pull/2096))
- ⚠️ **eslint-plugin:** remove deprecated prefer-standalone-component
rule
([#&#8203;2112](https://redirect.github.com/angular-eslint/angular-eslint/pull/2112))

##### ❤️ Thank You

- Daniel Kimmich
[@&#8203;json-derulo](https://redirect.github.com/json-derulo)
-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)
- JamesHenry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.4.3 (2024-11-29)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.4.2 (2024-11-23)

##### 🩹 Fixes

- **eslint-plugin:** fix placement of lifecycle interface for subclasses
([#&#8203;1965](https://redirect.github.com/angular-eslint/angular-eslint/pull/1965))
- **eslint-plugin:** handle `output()` and `input()` functions in
various rules
([#&#8203;2098](https://redirect.github.com/angular-eslint/angular-eslint/pull/2098))

##### ❤️ Thank You

-   Aleksandr Martirosyan
-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

#### 18.4.1 (2024-11-18)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.4.0 (2024-10-21)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.3.1 (2024-09-11)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.3.0 (2024-08-13)

##### 🚀 Features

-   **eslint-plugin:** new rule runtime-localize

##### ❤️ Thank You

-   m-akinc

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-standalone] ignore empty Directive
decorators

##### ❤️ Thank You

-   James Henry
-   Paweł Maniecki

#### 18.1.0 (2024-07-01)

##### 🚀 Features

- **eslint-plugin:** \[prefer-output-readonly] support output() function

##### 🩹 Fixes

-   update typescript-eslint packages to v8.0.0-alpha.37

##### ❤️ Thank You

-   Christian Svensson
-   Daniel Kimmich
-   Dave
-   Martijn van der Meij
-   Maximilian Main

#### 18.0.1 (2024-05-30)

##### 🩹 Fixes

- move typescript-eslint packages to peerDeps, consistently allow v7 and
v8

##### ❤️ Thank You

-   James Henry

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin-template)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

##### 🚀 Features

- use
[@&#8203;angular/compiler](https://redirect.github.com/angular/compiler)
19.2.3 and rename some AST nodes to match
([#&#8203;2320](https://redirect.github.com/angular-eslint/angular-eslint/pull/2320))
- **eslint-plugin-template:** add rule prefer-contextual-for-variables
([#&#8203;2311](https://redirect.github.com/angular-eslint/angular-eslint/pull/2311))
- **eslint-plugin-template:** \[button-has-type] add option to ignore
missing type
([#&#8203;2326](https://redirect.github.com/angular-eslint/angular-eslint/pull/2326))

##### 🩹 Fixes

- **eslint-plugin-template:** \[attributes-order] treat inputs without
square brackets as attributes
([#&#8203;2316](https://redirect.github.com/angular-eslint/angular-eslint/pull/2316))
- **eslint-plugin-template:** \[attributes-order] order i18n attributes
([#&#8203;2307](https://redirect.github.com/angular-eslint/angular-eslint/pull/2307))
- **eslint-plugin-template:** \[i18n] Avoid exception in i18n rule with
allowMarkupInContent=false
([#&#8203;2327](https://redirect.github.com/angular-eslint/angular-eslint/pull/2327))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
-   m-akinc [@&#8203;m-akinc](https://redirect.github.com/m-akinc)

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

##### 🩹 Fixes

- **eslint-plugin-template:** \[prefer-self-closing-tags] resolve wrong
reports when structural directive + no content + no self-closing
([#&#8203;2287](https://redirect.github.com/angular-eslint/angular-eslint/pull/2287))

##### ❤️ Thank You

-   Guillaume DROUARD

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- **prefer-static-string-properties:** exclude special attributes
([#&#8203;2273](https://redirect.github.com/angular-eslint/angular-eslint/pull/2273))
- **prefer-static-string-properties:** resolve bug with directives
([#&#8203;2271](https://redirect.github.com/angular-eslint/angular-eslint/pull/2271))
- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))
- **eslint-plugin-template:** \[prefer-static-string-properties] do not
check structural directives
([#&#8203;2253](https://redirect.github.com/angular-eslint/angular-eslint/pull/2253))
- **eslint-plugin-template:** \[prefer-self-closing-tags] allow nested
ng-content
([#&#8203;2257](https://redirect.github.com/angular-eslint/angular-eslint/pull/2257))
- **eslint-plugin-template:** \[prefer-self-closing-tags] do not treat
comments as whitespace
([#&#8203;2256](https://redirect.github.com/angular-eslint/angular-eslint/pull/2256))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
- Marie Briand
[@&#8203;mbriand-lucca](https://redirect.github.com/mbriand-lucca)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

##### 🚀 Features

- **eslint-plugin-template:** add rule prefer-static-string-properties
([#&#8203;2228](https://redirect.github.com/angular-eslint/angular-eslint/pull/2228))

##### 🩹 Fixes

- **eslint-plugin-template:** \[attribute-order] check for ng-template
within svg
([#&#8203;2223](https://redirect.github.com/angular-eslint/angular-eslint/pull/2223))
- **eslint-plugin-template:** \[prefer-self-closing-tags] do not remove
HTML-encoded whitespace
([#&#8203;2229](https://redirect.github.com/angular-eslint/angular-eslint/pull/2229))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

##### 🩹 Fixes

- **eslint-plugin-template:** prevent the slot tag from being
self-closing
([#&#8203;2088](https://redirect.github.com/angular-eslint/angular-eslint/pull/2088))

##### ❤️ Thank You

- Joan Llenas
[@&#8203;joanllenas](https://redirect.github.com/joanllenas)

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.3 (2024-11-29)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.2 (2024-11-23)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.1 (2024-11-18)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.0 (2024-10-21)

##### 🩹 Fixes

- update typescript-eslint packages to v8.10.0
([#&#8203;2046](https://redirect.github.com/angular-eslint/angular-eslint/pull/2046))
- update dependency aria-query to v5.3.2
([#&#8203;2053](https://redirect.github.com/angular-eslint/angular-eslint/pull/2053))
- update dependency aria-query to v5.3.1
([#&#8203;2043](https://redirect.github.com/angular-eslint/angular-eslint/pull/2043))

#### 18.3.1 (2024-09-11)

##### 🩹 Fixes

-   **template-parser:** visit receiver of Call expression

-   **template-parser:** visit receiver of Call expression"

-   **template-parser:** visit receiver of Call expression

##### ❤️ Thank You

-   James Henry
-   Paweł Maniecki

#### 18.3.0 (2024-08-13)

##### 🩹 Fixes

- **eslint-plugin-template:** \[interactive-supports-focus] allowList
with form as default option to support event bubbling

- **eslint-plugin-template:** \[prefer-self-closing-tags] fix ng-content
with rich default content

-   **prefer-self-closing-tags:** handle both forward and backward slash

##### ❤️ Thank You

-   Daniel Kimmich
-   Sandi Barr
-   Simon

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### 🩹 Fixes

-   update dependency axobject-query to v4.1.0

- **eslint-plugin-template:** add meta to preprocessor to resolve eslint
cache error

##### ❤️ Thank You

-   James Henry
-   kwiateusz

#### 18.1.0 (2024-07-01)

##### 🚀 Features

- **eslint-plugin:** \[no-call-expression] add allowPrefix and
allowSuffix

##### 🩹 Fixes

-   update typescript-eslint packages to v8.0.0-alpha.37

- **eslint-plugin-template:** \[prefer-self-closing-tags] always ignore
index.html files

- **eslint-plugin-template:** \[prefer-self-closing-tags] support
ng-content with fallback content

##### ❤️ Thank You

-   Christian Svensson
-   Daniel Kimmich
-   Dave
-   Martijn van der Meij
-   Maximilian Main

#### 18.0.1 (2024-05-30)

##### 🩹 Fixes

- move typescript-eslint packages to peerDeps, consistently allow v7 and
v8

##### ❤️ Thank You

-   James Henry

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/schematics)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

##### 🩹 Fixes

- update dependency eslint to v9.23.0
([#&#8203;2331](https://redirect.github.com/angular-eslint/angular-eslint/pull/2331))
- update typescript-eslint packages to v8.27.0
([#&#8203;2328](https://redirect.github.com/angular-eslint/angular-eslint/pull/2328))
- update typescript-eslint packages to v8.26.1
([#&#8203;2313](https://redirect.github.com/angular-eslint/angular-eslint/pull/2313))

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

##### 🩹 Fixes

- update dependency eslint to v9.22.0
([#&#8203;2294](https://redirect.github.com/angular-eslint/angular-eslint/pull/2294))
- update typescript-eslint packages to v8.26.0
([#&#8203;2282](https://redirect.github.com/angular-eslint/angular-eslint/pull/2282))

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- update typescript-eslint packages to v8.25.0
([#&#8203;2263](https://redirect.github.com/angular-eslint/angular-eslint/pull/2263))
- update dependency eslint to v9.21.0
([#&#8203;2243](https://redirect.github.com/angular-eslint/angular-eslint/pull/2243))
- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))
- update typescript-eslint packages to v8.24.0
([#&#8203;2240](https://redirect.github.com/angular-eslint/angular-eslint/pull/2240))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

##### 🩹 Fixes

- update dependency eslint to v9.20.0
([#&#8203;2217](https://redirect.github.com/angular-eslint/angular-eslint/pull/2217))
- update typescript-eslint packages to v8.23.0
([#&#8203;2212](https://redirect.github.com/angular-eslint/angular-eslint/pull/2212))
- update dependency semver to v7.7.1
([#&#8203;2225](https://redirect.github.com/angular-eslint/angular-eslint/pull/2225))
- update typescript-eslint packages to v8.20.0
([#&#8203;2185](https://redirect.github.com/angular-eslint/angular-eslint/pull/2185))
- update dependency eslint to v9.18.0
([#&#8203;2181](https://redirect.github.com/angular-eslint/angular-eslint/pull/2181))
- update dependency ignore to v7
([#&#8203;2200](https://redirect.github.com/angular-eslint/angular-eslint/pull/2200))

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

##### 🩹 Fixes

- update typescript-eslint packages to v8.18.0
([#&#8203;2171](https://redirect.github.com/angular-eslint/angular-eslint/pull/2171))

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

##### 🩹 Fixes

- update typescript-eslint packages to v8.17.0
([#&#8203;2153](https://redirect.github.com/angular-eslint/angular-eslint/pull/2153))
- update dependency eslint to v9.16.0
([#&#8203;2148](https://redirect.github.com/angular-eslint/angular-eslint/pull/2148))

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

##### 🚀 Features

- allow referencing angular-eslint as the schematics collection
([2be3107b](https://redirect.github.com/angular-eslint/angular-eslint/commit/2be3107b))
- update angular packages to the stable v19
([#&#8203;2120](https://redirect.github.com/angular-eslint/angular-eslint/pull/2120))

##### ❤️ Thank You

- JamesHenry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)
- Leosvel Pérez Espinosa
[@&#8203;leosvelperez](https://redirect.github.com/leosvelperez)

#### 18.4.3 (2024-11-29)

##### 🩹 Fixes

- update typescript-eslint packages to v8.16.0
([#&#8203;2135](https://redirect.github.com/angular-eslint/angular-eslint/pull/2135))
- yarn pnp issues
([#&#8203;2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.4.2 (2024-11-23)

This was a version bump only for schematics to align it with other
projects, there were no code changes.

#### 18.4.1 (2024-11-18)

##### 🩹 Fixes

- update dependency ignore to v6
([#&#8203;2047](https://redirect.github.com/angular-eslint/angular-eslint/pull/2047))

#### 18.4.0 (2024-10-21)

##### 🚀 Features

- support ESM configs and .cjs and .mjs extensions
([#&#8203;2068](https://redirect.github.com/angular-eslint/angular-eslint/pull/2068))

##### 🩹 Fixes

- update dependency eslint to v9.13.0, support noConfigLookup
([#&#8203;2045](https://redirect.github.com/angular-eslint/angular-eslint/pull/2045))
- update typescript-eslint packages to v8.10.0
([#&#8203;2046](https://redirect.github.com/angular-eslint/angular-eslint/pull/2046))
- update typescript-eslint packages to v8.5.0
([#&#8203;2020](https://redirect.github.com/angular-eslint/angular-eslint/pull/2020))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.3.1 (2024-09-11)

##### 🩹 Fixes

-   update dependency eslint to v9.9.1

-   update typescript-eslint packages to v8.2.0

#### 18.3.0 (2024-08-13)

##### 🩹 Fixes

-   ensure consistent nx dependency versions

-   update dependency eslint to v9.9.0

-   update dependency ignore to v5.3.2

-   update typescript-eslint packages to v8.0.1

-   update typescript-eslint packages to v8.1.0

##### ❤️ Thank You

-   James Henry

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### 🩹 Fixes

-   update dependency semver to v7.6.3

##### ❤️ Thank You

-   James Henry

#### 18.1.0 (2024-07-01)

##### 🩹 Fixes

-   update dependency eslint to v9.4.0

-   update dependency eslint to v9.5.0

-   update dependency eslint to v9.6.0

-   update typescript-eslint packages to v8.0.0-alpha.37

-   update typescript-eslint packages to v8.0.0-alpha.38

##### ❤️ Thank You

-   Christian Svensson
-   Daniel Kimmich
-   Dave
-   Martijn van der Meij
-   Maximilian Main

#### 18.0.1 (2024-05-30)

This was a version bump only for schematics to align it with other
projects, there were no code changes.

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/template-parser)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

##### 🚀 Features

- use
[@&#8203;angular/compiler](https://redirect.github.com/angular/compiler)
19.2.3 and rename some AST nodes to match
([#&#8203;2320](https://redirect.github.com/angular-eslint/angular-eslint/pull/2320))
- **template-parser:** visit
[@&#8203;let](https://redirect.github.com/let) child nodes
([#&#8203;2312](https://redirect.github.com/angular-eslint/angular-eslint/pull/2312))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.3 (2024-11-29)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.2 (2024-11-23)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.1 (2024-11-18)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.0 (2024-10-21)

##### 🩹 Fixes

- **template-parser:** traverse ng-content fallback content
([#&#8203;2031](https://redirect.github.com/angular-eslint/angular-eslint/pull/2031))

##### ❤️ Thank You

- Matt Lewis
[@&#8203;mattlewis92](https://redirect.github.com/mattlewis92)

#### 18.3.1 (2024-09-11)

##### 🩹 Fixes

-   **template-parser:** visit receiver of Call expression

-   **template-parser:** visit receiver of Call expression"

-   **template-parser:** visit receiver of Call expression

##### ❤️ Thank You

-   James Henry
-   Paweł Maniecki

#### 18.3.0 (2024-08-13)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### ❤️ Thank You

-   James Henry

#### 18.1.0 (2024-07-01)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.0.1 (2024-05-30)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`^0.24.0` ->
`^0.25.0`](https://renovatebot.com/diffs/npm/esbuild/0.24.2/0.25.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.24.2/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.24.2/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[GHSA-67mh-4wv8-2f99](https://redirect.github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99)

### Summary

esbuild allows any websites to send any request to the development
server and read the response due to default CORS settings.

### Details

esbuild sets `Access-Control-Allow-Origin: *` header to all requests,
including the SSE connection, which allows any websites to send any
request to the development server and read the response.

https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L121

https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L363

**Attack scenario**:

1. The attacker serves a malicious web page
(`http://malicious.example.com`).
1. The user accesses the malicious web page.
1. The attacker sends a `fetch('http://127.0.0.1:8000/main.js')` request
by JS in that malicious web page. This request is normally blocked by
same-origin policy, but that's not the case for the reasons above.
1. The attacker gets the content of `http://127.0.0.1:8000/main.js`.

In this scenario, I assumed that the attacker knows the URL of the
bundle output file name. But the attacker can also get that information
by

- Fetching `/index.html`: normally you have a script tag here
- Fetching `/assets`: it's common to have a `assets` directory when you
have JS files and CSS files in a different directory and the directory
listing feature tells the attacker the list of files
- Connecting `/esbuild` SSE endpoint: the SSE endpoint sends the URL
path of the changed files when the file is changed (`new
EventSource('/esbuild').addEventListener('change', e =>
console.log(e.type, e.data))`)
- Fetching URLs in the known file: once the attacker knows one file, the
attacker can know the URLs imported from that file

The scenario above fetches the compiled content, but if the victim has
the source map option enabled, the attacker can also get the
non-compiled content by fetching the source map file.

### PoC

1. Download
[reproduction.zip](https://redirect.github.com/user-attachments/files/18561484/reproduction.zip)
2. Extract it and move to that directory
1. Run `npm i`
1. Run `npm run watch`
1. Run `fetch('http://127.0.0.1:8000/app.js').then(r =>
r.text()).then(content => console.log(content))` in a different
website's dev tools.

![image](https://redirect.github.com/user-attachments/assets/08fc2e4d-e1ec-44ca-b0ea-78a73c3c40e9)

### Impact

Users using the serve feature may get the source code stolen by
malicious websites.

---

### Release Notes

<details>
<summary>evanw/esbuild (esbuild)</summary>

###
[`v0.25.0`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#v0250)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.24.2...v0.25.0)

**This release deliberately contains backwards-incompatible changes.**
To avoid automatically picking up releases like this, you should either
be pinning the exact version of `esbuild` in your `package.json` file
(recommended) or be using a version range syntax that only accepts patch
upgrades such as `^0.24.0` or `~0.24.0`. See npm's documentation about
[semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more
information.

- Restrict access to esbuild's development server
([GHSA-67mh-4wv8-2f99](https://redirect.github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99))

This change addresses esbuild's first security vulnerability report.
Previously esbuild set the `Access-Control-Allow-Origin` header to `*`
to allow esbuild's development server to be flexible in how it's used
for development. However, this allows the websites you visit to make
HTTP requests to esbuild's local development server, which gives
read-only access to your source code if the website were to fetch your
source code's specific URL. You can read more information in [the
report](https://redirect.github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99).

Starting with this release,
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) will now
be disabled, and requests will now be denied if the host does not match
the one provided to `--serve=`. The default host is `0.0.0.0`, which
refers to all of the IP addresses that represent the local machine (e.g.
both `127.0.0.1` and `192.168.0.1`). If you want to customize anything
about esbuild's development server, you can [put a proxy in front of
esbuild](https://esbuild.github.io/api/#serve-proxy) and modify the
incoming and/or outgoing requests.

In addition, the `serve()` API call has been changed to return an array
of `hosts` instead of a single `host` string. This makes it possible to
determine all of the hosts that esbuild's development server will
accept.

Thanks to [@&#8203;sapphi-red](https://redirect.github.com/sapphi-red)
for reporting this issue.

- Delete output files when a build fails in watch mode
([#&#8203;3643](https://redirect.github.com/evanw/esbuild/issues/3643))

It has been requested for esbuild to delete files when a build fails in
watch mode. Previously esbuild left the old files in place, which could
cause people to not immediately realize that the most recent build
failed. With this release, esbuild will now delete all output files if a
rebuild fails. Fixing the build error and triggering another rebuild
will restore all output files again.

- Fix correctness issues with the CSS nesting transform
([#&#8203;3620](https://redirect.github.com/evanw/esbuild/issues/3620),
[#&#8203;3877](https://redirect.github.com/evanw/esbuild/issues/3877),
[#&#8203;3933](https://redirect.github.com/evanw/esbuild/issues/3933),
[#&#8203;3997](https://redirect.github.com/evanw/esbuild/issues/3997),
[#&#8203;4005](https://redirect.github.com/evanw/esbuild/issues/4005),
[#&#8203;4037](https://redirect.github.com/evanw/esbuild/pull/4037),
[#&#8203;4038](https://redirect.github.com/evanw/esbuild/pull/4038))

    This release fixes the following problems:

- Naive expansion of CSS nesting can result in an exponential blow-up of
generated CSS if each nesting level has multiple selectors. Previously
esbuild sometimes collapsed individual nesting levels using `:is()` to
limit expansion. However, this collapsing wasn't correct in some cases,
so it has been removed to fix correctness issues.

        ```css
        /* Original code */
        .parent {
          > .a,
          > .b1 > .b2 {
            color: red;
          }
        }

        /* Old output (with --supported:nesting=false) */
        .parent > :is(.a, .b1 > .b2) {
          color: red;
        }

        /* New output (with --supported:nesting=false) */
        .parent > .a,
        .parent > .b1 > .b2 {
          color: red;
        }
        ```

Thanks to [@&#8203;tim-we](https://redirect.github.com/tim-we) for
working on a fix.

- The `&` CSS nesting selector can be repeated multiple times to
increase CSS specificity. Previously esbuild ignored this possibility
and incorrectly considered `&&` to have the same specificity as `&`.
With this release, this should now work correctly:

        ```css
        /* Original code (color should be red) */
        div {
          && { color: red }
          & { color: blue }
        }

        /* Old output (with --supported:nesting=false) */
        div {
          color: red;
        }
        div {
          color: blue;
        }

        /* New output (with --supported:nesting=false) */
        div:is(div) {
          color: red;
        }
        div {
          color: blue;
        }
        ```

Thanks to [@&#8203;CPunisher](https://redirect.github.com/CPunisher) for
working on a fix.

- Previously transforming nested CSS incorrectly removed leading
combinators from within pseudoclass selectors such as `:where()`. This
edge case has been fixed and how has test coverage.

        ```css
        /* Original code */
        a b:has(> span) {
          a & {
            color: green;
          }
        }

        /* Old output (with --supported:nesting=false) */
        a :is(a b:has(span)) {
          color: green;
        }

        /* New output (with --supported:nesting=false) */
        a :is(a b:has(> span)) {
          color: green;
        }
        ```

This fix was contributed by
[@&#8203;NoremacNergfol](https://redirect.github.com/NoremacNergfol).

- The CSS minifier contains logic to remove the `&` selector when it can
be implied, which happens when there is only one and it's the leading
token. However, this logic was incorrectly also applied to selector
lists inside of pseudo-class selectors such as `:where()`. With this
release, the minifier will now avoid applying this logic in this edge
case:

        ```css
        /* Original code */
        .a {
          & .b { color: red }
          :where(& .b) { color: blue }
        }

        /* Old output (with --minify) */
        .a{.b{color:red}:where(.b){color:#&#8203;00f}}

        /* New output (with --minify) */
        .a{.b{color:red}:where(& .b){color:#&#8203;00f}}
        ```

- Fix some correctness issues with source maps
([#&#8203;1745](https://redirect.github.com/evanw/esbuild/issues/1745),
[#&#8203;3183](https://redirect.github.com/evanw/esbuild/issues/3183),
[#&#8203;3613](https://redirect.github.com/evanw/esbuild/issues/3613),
[#&#8203;3982](https://redirect.github.com/evanw/esbuild/issues/3982))

Previously esbuild incorrectly treated source map path references as
file paths instead of as URLs. With this release, esbuild will now treat
source map path references as URLs. This fixes the following problems
with source maps:

- File names in `sourceMappingURL` that contained a space previously did
not encode the space as `%20`, which resulted in JavaScript tools
(including esbuild) failing to read that path back in when consuming the
generated output file. This should now be fixed.

- Absolute URLs in `sourceMappingURL` that use the `file://` scheme
previously attempted to read from a folder called `file:`. These URLs
should now be recognized and parsed correctly.

- Entries in the `sources` array in the source map are now treated as
URLs instead of file paths. The correct behavior for this is much more
clear now that source maps has a [formal
specification](https://tc39.es/ecma426/). Many thanks to those who
worked on the specification.

- Fix incorrect package for `@esbuild/netbsd-arm64`
([#&#8203;4018](https://redirect.github.com/evanw/esbuild/issues/4018))

Due to a copy+paste typo, the binary published to
`@esbuild/netbsd-arm64` was not actually for `arm64`, and didn't run in
that environment. This release should fix running esbuild in that
environment (NetBSD on 64-bit ARM). Sorry about the mistake.

- Fix a minification bug with bitwise operators and bigints
([#&#8203;4065](https://redirect.github.com/evanw/esbuild/issues/4065))

This change removes an incorrect assumption in esbuild that all bitwise
operators result in a numeric integer. That assumption was correct up
until the introduction of bigints in ES2020, but is no longer correct
because almost all bitwise operators now operate on both numbers and
bigints. Here's an example of the incorrect minification:

    ```js
    // Original code
    if ((a & b) !== 0) found = true

    // Old output (with --minify)
    a&b&&(found=!0);

    // New output (with --minify)
    (a&b)!==0&&(found=!0);
    ```

- Fix esbuild incorrectly rejecting valid TypeScript edge case
([#&#8203;4027](https://redirect.github.com/evanw/esbuild/issues/4027))

    The following TypeScript code is valid:

    ```ts
    export function open(async?: boolean): void {
      console.log(async as boolean)
    }
    ```

Before this version, esbuild would fail to parse this with a syntax
error as it expected the token sequence `async as ...` to be the start
of an async arrow function expression `async as => ...`. This edge case
should be parsed correctly by esbuild starting with this release.

- Transform BigInt values into constructor calls when unsupported
([#&#8203;4049](https://redirect.github.com/evanw/esbuild/issues/4049))

Previously esbuild would refuse to compile the BigInt literals (such as
`123n`) if they are unsupported in the configured target environment
(such as with `--target=es6`). The rationale was that they cannot be
polyfilled effectively because they change the behavior of JavaScript's
arithmetic operators and JavaScript doesn't have operator overloading.

However, this prevents using esbuild with certain libraries that would
otherwise work if BigInt literals were ignored, such as with old
versions of the [`buffer`
library](https://redirect.github.com/feross/buffer) before the library
fixed support for running in environments without BigInt support. So
with this release, esbuild will now turn BigInt literals into BigInt
constructor calls (so `123n` becomes `BigInt(123)`) and generate a
warning in this case. You can turn off the warning with
`--log-override:bigint=silent` or restore the warning to an error with
`--log-override:bigint=error` if needed.

- Change how `console` API dropping works
([#&#8203;4020](https://redirect.github.com/evanw/esbuild/issues/4020))

Previously the `--drop:console` feature replaced all method calls off of
the `console` global with `undefined` regardless of how long the
property access chain was (so it applied to `console.log()` and
`console.log.call(console)` and `console.log.not.a.method()`). However,
it was pointed out that this breaks uses of `console.log.bind(console)`.
That's also incompatible with Terser's implementation of the feature,
which is where this feature originally came from (it does support
`bind`). So with this release, using this feature with esbuild will now
only replace one level of method call (unless extended by `call` or
`apply`) and will replace the method being called with an empty function
in complex cases:

    ```js
    // Original code
    const x = console.log('x')
    const y = console.log.call(console, 'y')
    const z = console.log.bind(console)('z')

    // Old output (with --drop-console)
    const x = void 0;
    const y = void 0;
    const z = (void 0)("z");

    // New output (with --drop-console)
    const x = void 0;
    const y = void 0;
    const z = (() => {
    }).bind(console)("z");
    ```

    This should more closely match Terser's existing behavior.

-   Allow BigInt literals as `define` values

With this release, you can now use BigInt literals as define values,
such as with `--define:FOO=123n`. Previously trying to do this resulted
in a syntax error.

- Fix a bug with resolve extensions in `node_modules`
([#&#8203;4053](https://redirect.github.com/evanw/esbuild/issues/4053))

The `--resolve-extensions=` option lets you specify the order in which
to try resolving implicit file extensions. For complicated reasons,
esbuild reorders TypeScript file extensions after JavaScript ones inside
of `node_modules` so that JavaScript source code is always preferred to
TypeScript source code inside of dependencies. However, this reordering
had a bug that could accidentally change the relative order of
TypeScript file extensions if one of them was a prefix of the other.
That bug has been fixed in this release. You can see the issue for
details.

- Better minification of statically-determined `switch` cases
([#&#8203;4028](https://redirect.github.com/evanw/esbuild/issues/4028))

With this release, esbuild will now try to trim unused code within
`switch` statements when the test expression and `case` expressions are
primitive literals. This can arise when the test expression is an
identifier that is substituted for a primitive literal at compile time.
For example:

    ```js
    // Original code
    switch (MODE) {
      case 'dev':
        installDevToolsConsole()
        break
      case 'prod':
        return
      default:
        throw new Error
    }

    // Old output (with --minify '--define:MODE="prod"')

switch("prod"){case"dev":installDevToolsConsole();break;case"prod":return;default:throw
new Error}

    // New output (with --minify '--define:MODE="prod"')
    return;
    ```

- Emit `/* @&#8203;__KEY__ */` for string literals derived from property
names
([#&#8203;4034](https://redirect.github.com/evanw/esbuild/issues/4034))

Property name mangling is an advanced feature that shortens certain
property names for better minification (I say "advanced feature" because
it's very easy to break your code with it). Sometimes you need to store
a property name in a string, such as `obj.get('foo')` instead of
`obj.foo`. JavaScript minifiers such as esbuild and
[Terser](https://terser.org/) have a convention where a `/*
@&#8203;__KEY__ */` comment before the string makes it behave like a
property name. So `obj.get(/* @&#8203;__KEY__ */ 'foo')` allows the
contents of the string `'foo'` to be shortened.

However, esbuild sometimes itself generates string literals containing
property names when transforming code, such as when lowering class
fields to ES6 or when transforming TypeScript decorators. Previously
esbuild didn't generate its own `/* @&#8203;__KEY__ */` comments in this
case, which means that minifying your code by running esbuild again on
its own output wouldn't work correctly (this does not affect people that
both minify and transform their code in a single step).

With this release, esbuild will now generate `/* @&#8203;__KEY__ */`
comments for property names in generated string literals. To avoid lots
of unnecessary output for people that don't use this advanced feature,
the generated comments will only be present when the feature is active.
If you want to generate the comments but not actually mangle any
property names, you can use a flag that has no effect such as
`--reserve-props=.`, which tells esbuild to not mangle any property
names (but still activates this feature).

- The `text` loader now strips the UTF-8 BOM if present
([#&#8203;3935](https://redirect.github.com/evanw/esbuild/issues/3935))

Some software (such as Notepad on Windows) can create text files that
start with the three bytes `0xEF 0xBB 0xBF`, which is referred to as the
"byte order mark". This prefix is intended to be removed before using
the text. Previously esbuild's `text` loader included this byte sequence
in the string, which turns into a prefix of `\uFEFF` in a JavaScript
string when decoded from UTF-8. With this release, esbuild's `text`
loader will now remove these bytes when they occur at the start of the
file.

- Omit legal comment output files when empty
([#&#8203;3670](https://redirect.github.com/evanw/esbuild/issues/3670))

Previously configuring esbuild with `--legal-comment=external` or
`--legal-comment=linked` would always generate a `.LEGAL.txt` output
file even if it was empty. Starting with this release, esbuild will now
only do this if the file will be non-empty. This should result in a more
organized output directory in some cases.

- Update Go from 1.23.1 to 1.23.5
([#&#8203;4056](https://redirect.github.com/evanw/esbuild/issues/4056),
[#&#8203;4057](https://redirect.github.com/evanw/esbuild/pull/4057))

This should have no effect on existing code as this version change does
not change Go's operating system support. It may remove certain reports
from vulnerability scanners that detect which version of the Go compiler
esbuild uses.

This PR was contributed by
[@&#8203;MikeWillCook](https://redirect.github.com/MikeWillCook).

- Allow passing a port of 0 to the development server
([#&#8203;3692](https://redirect.github.com/evanw/esbuild/issues/3692))

Unix sockets interpret a port of 0 to mean "pick a random unused port in
the [ephemeral port](https://en.wikipedia.org/wiki/Ephemeral_port)
range". However, esbuild's default behavior when the port is not
specified is to pick the first unused port starting from 8000 and
upward. This is more convenient because port 8000 is typically free, so
you can for example restart the development server and reload your app
in the browser without needing to change the port in the URL. Since
esbuild is written in Go (which does not have optional fields like
JavaScript), not specifying the port in Go means it defaults to 0, so
previously passing a port of 0 to esbuild caused port 8000 to be picked.

Starting with this release, passing a port of 0 to esbuild when using
the CLI or the JS API will now pass port 0 to the OS, which will pick a
random ephemeral port. To make this possible, the `Port` option in the
Go API has been changed from `uint16` to `int` (to allow for additional
sentinel values) and passing a port of -1 in Go now picks a random port.
Both the CLI and JS APIs now remap an explicitly-provided port of 0 into
-1 for the internal Go API.

Another option would have been to change `Port` in Go from `uint16` to
`*uint16` (Go's closest equivalent of `number | undefined`). However,
that would make the common case of providing an explicit port in Go very
awkward as Go doesn't support taking the address of integer constants.
This tradeoff isn't worth it as picking a random ephemeral port is a
rare use case. So the CLI and JS APIs should now match standard Unix
behavior when the port is 0, but you need to use -1 instead with Go API.

- Minification now avoids inlining constants with direct `eval`
([#&#8203;4055](https://redirect.github.com/evanw/esbuild/issues/4055))

    Direct `eval` can be used to introduce a new variable like this:

    ```js
    const variable = false
    ;(function () {
      eval("var variable = true")
      console.log(variable)
    })()
    ```

Previously esbuild inlined `variable` here (which became `false`), which
changed the behavior of the code. This inlining is now avoided, but
please keep in mind that direct `eval` breaks many assumptions that
JavaScript tools hold about normal code (especially when bundling) and I
do not recommend using it. There are usually better alternatives that
have a more localized impact on your code. You can read more about this
here: https://esbuild.github.io/link/direct-eval/

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjM5LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
)

<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

Adds docs for setting evaluation context in angular

Signed-off-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[0.0.12](angular-sdk-v0.0.11...angular-sdk-v0.0.12)
(2025-04-11)

### ✨ New Features

* **angular:** add docs for setting evaluation context in angular
([#1170](#1170))
([24f1b23](24f1b23))

### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/web-sdk bumped from * to 1.5.0

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Lukas Reining <[email protected]>
Co-authored-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[0.2.3](nestjs-sdk-v0.2.2...nestjs-sdk-v0.2.3)
(2025-04-11)

### 🧹 Chore

* update sdk peer
([#1142](#1142))
([8bb6206](8bb6206))

### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/server-sdk bumped from * to 1.18.0

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[1.18.0](server-sdk-v1.17.1...server-sdk-v1.18.0)
(2025-04-11)

### ✨ New Features

* add a top-level method for accessing providers
([#1152](#1152))
([ae8fce8](ae8fce8))
* add support for abort controllers to event handlers
([#1151](#1151))
([6a22483](6a22483))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <[email protected]>
Co-authored-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[1.5.0](web-sdk-v1.4.1...web-sdk-v1.5.0)
(2025-04-11)

### ✨ New Features

* add a top-level method for accessing providers
([#1152](#1152))
([ae8fce8](ae8fce8))
* add support for abort controllers to event handlers
([#1151](#1151))
([6a22483](6a22483))

### 🐛 Bug Fixes

* Typo in name of the function
([2c5b37c](2c5b37c))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Todd Baert <[email protected]>
Co-authored-by: Lukas Reining <[email protected]>
Co-authored-by: Todd Baert <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
openfeaturebot and others added 22 commits July 20, 2025 18:11
🤖 I have created a release *beep* *boop*
---

##
[0.0.14](angular-sdk-v0.0.13...angular-sdk-v0.0.14)
(2025-05-25)

### 🐛 Bug Fixes

* **angular:** add license and url field to package.json
([b2784f5](b2784f5))

### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/web-sdk bumped from * to 1.5.1

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Lukas Reining <[email protected]>
Co-authored-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [rxjs](https://rxjs.dev)
([source](https://redirect.github.com/reactivex/rxjs)) | [`7.8.1` ->
`7.8.2`](https://renovatebot.com/diffs/npm/rxjs/7.8.1/7.8.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/rxjs/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rxjs/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rxjs/7.8.1/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rxjs/7.8.1/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>reactivex/rxjs (rxjs)</summary>

###
[`v7.8.2`](https://redirect.github.com/reactivex/rxjs/compare/7.8.1...7.8.2)

[Compare
Source](https://redirect.github.com/reactivex/rxjs/compare/7.8.1...7.8.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [jest-preset-angular](https://thymikee.github.io/jest-preset-angular)
([source](https://redirect.github.com/thymikee/jest-preset-angular)) |
[`14.5.1` ->
`14.5.5`](https://renovatebot.com/diffs/npm/jest-preset-angular/14.5.1/14.5.5)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/jest-preset-angular/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/jest-preset-angular/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/jest-preset-angular/14.5.1/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/jest-preset-angular/14.5.1/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>thymikee/jest-preset-angular (jest-preset-angular)</summary>

###
[`v14.5.5`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1455-2025-04-15)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.4...v14.5.5)

##### Bug Fixes

- fix: allow name exports for `presets` subpath
([9100baf](https://redirect.github.com/thymikee/jest-preset-angular/commit/9100baf))

###
[`v14.5.4`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1454-2025-03-31)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.3...v14.5.4)

##### Bug Fixes

- fix: warn when using both `isolatedModules` and
`emitDecoratorMetadata`
([#&#8203;3029](https://redirect.github.com/thymikee/jest-preset-angular/issues/3029))
([51db8f4](https://redirect.github.com/thymikee/jest-preset-angular/commit/51db8f4)),
closes
[#&#8203;3029](https://redirect.github.com/thymikee/jest-preset-angular/issues/3029)
- update dependency ts-jest to v29.3.0
([1d8415d](https://redirect.github.com/thymikee/jest-preset-angular/commit/1d8415d))

###
[`v14.5.3`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1453-2025-02-24)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.2...v14.5.3)

##### Bug Fixes

- build: update bundle `jit_transform.js`, closes
[#&#8203;2979](https://redirect.github.com/thymikee/jest-preset-angular/issues/2979)

###
[`v14.5.2`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1452-2025-02-21)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.1...v14.5.2)

##### Bug Fixes

- fix: transform `js` ESM file from `node_modules`
([b2b3934](https://redirect.github.com/thymikee/jest-preset-angular/commit/b2b3934)),
closes
[#&#8203;2913](https://redirect.github.com/thymikee/jest-preset-angular/issues/2913)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
Signed-off-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[0.0.15](angular-sdk-v0.0.14...angular-sdk-v0.0.15)
(2025-05-27)

### 🐛 Bug Fixes

* **angular:** update docs
([#1200](#1200))
([b6ea588](b6ea588))

### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/web-sdk bumped from * to 1.5.1

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Lukas Reining <[email protected]>
Co-authored-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
Adds the environment for NPM publish step of the pipeline to the correct
job.

Signed-off-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[0.2.5](nestjs-sdk-v0.2.4...nestjs-sdk-v0.2.5)
(2025-05-27)

### ✨ New Features

* adds RequireFlagsEnabled decorator
([#1159](#1159))
([59b8fe9](59b8fe9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Lukas Reining <[email protected]>
Co-authored-by: Lukas Reining <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
node v18 is now EOL

Signed-off-by: Todd Baert <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [prettier](https://prettier.io)
([source](https://redirect.github.com/prettier/prettier)) | [`3.4.2` ->
`3.5.3`](https://renovatebot.com/diffs/npm/prettier/3.4.2/3.5.3) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/prettier/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/prettier/3.4.2/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.4.2/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>prettier/prettier (prettier)</summary>

###
[`v3.5.3`](https://redirect.github.com/prettier/prettier/compare/3.5.2...b51ba9d46765bcfab714ebca982bd04ad25ae562)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.5.2...3.5.3)

###
[`v3.5.2`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#352)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.5.1...3.5.2)

[diff](https://redirect.github.com/prettier/prettier/compare/3.5.1...3.5.2)

##### Remove `module-sync` condition
([#&#8203;17156](https://redirect.github.com/prettier/prettier/pull/17156)
by [@&#8203;fisker](https://redirect.github.com/fisker))

In Prettier 3.5.0, [we added `module-sync` condition to
`package.json`](https://prettier.io/blog/2025/02/09/3.5.0#use-esm-entrypoint-for-requireesm-16958-by-tats-u),
so that `require("prettier")` can use ESM version, but turns out it
doesn't work if CommonJS and ESM plugins both imports builtin plugins.
To solve this problem, we decide simply remove the `module-sync`
condition, so `require("prettier")` will still use the CommonJS version,
we'll revisit until `require(ESM)` feature is more stable.

###
[`v3.5.1`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#351)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.5.0...3.5.1)

[diff](https://redirect.github.com/prettier/prettier/compare/3.5.0...3.5.1)

##### Fix CLI crash when cache for old version exists
([#&#8203;17100](https://redirect.github.com/prettier/prettier/pull/17100)
by [@&#8203;sosukesuzuki](https://redirect.github.com/sosukesuzuki))

Prettier 3.5 uses a different cache format than previous versions,
Prettier 3.5.0 crashes when reading existing cache file, Prettier 3.5.1
fixed the problem.

##### Support dockercompose and github-actions-workflow in VSCode
([#&#8203;17101](https://redirect.github.com/prettier/prettier/pull/17101)
by [@&#8203;remcohaszing](https://redirect.github.com/remcohaszing))

Prettier now supports the `dockercompose` and `github-actions-workflow`
languages in Visual Studio Code.

###
[`v3.5.0`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#350)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.4.2...3.5.0)

[diff](https://redirect.github.com/prettier/prettier/compare/3.4.2...3.5.0)

🔗 [Release Notes](https://prettier.io/blog/2025/02/09/3.5.0.html)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`22.15.17` ->
`22.15.23`](https://renovatebot.com/diffs/npm/@types%2fnode/22.15.17/22.15.23)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/22.15.17/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/22.15.17/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xNi4wIiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
…aluation data (#1189)

## This PR

- update the evaluation event to match the latest OTel semcon

### Related Issues

Fixes #1188

### Notes

Update the createEvaluationEvent to match the latest OpenTelemetry spec.
Unforutnately, this is a breaking change. I'll denote this in the
release notes but not in the library version. That's because we're
following the experimental OTel spec and the method itself is currently
undocumented except from the generated JS Doc.

It's also worth noting that OTel JS SDK event API doesn't currently
support object as attribute values. @dyladan will update the OTel SDK.

### Follow-up Tasks

Update the ToggleShop.

### How to test

`npm run test`

Signed-off-by: Michael Beemer <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`0.25.4` ->
`0.25.5`](https://renovatebot.com/diffs/npm/esbuild/0.25.4/0.25.5) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.25.4/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.25.4/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>evanw/esbuild (esbuild)</summary>

###
[`v0.25.5`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0255)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.25.4...v0.25.5)

- Fix a regression with `browser` in `package.json`
([#&#8203;4187](https://redirect.github.com/evanw/esbuild/issues/4187))

The fix to
[#&#8203;4144](https://redirect.github.com/evanw/esbuild/issues/4144) in
version 0.25.3 introduced a regression that caused `browser` overrides
specified in `package.json` to fail to override relative path names that
end in a trailing slash. That behavior change affected the
`[email protected]` package. This regression has been fixed, and now has test
coverage.

- Add support for certain keywords as TypeScript tuple labels
([#&#8203;4192](https://redirect.github.com/evanw/esbuild/issues/4192))

Previously esbuild could incorrectly fail to parse certain keywords as
TypeScript tuple labels that are parsed by the official TypeScript
compiler if they were followed by a `?` modifier. These labels included
`function`, `import`, `infer`, `new`, `readonly`, and `typeof`. With
this release, these keywords will now be parsed correctly. Here's an
example of some affected code:

    ```ts
    type Foo = [
      value: any,
      readonly?: boolean, // This is now parsed correctly
    ]
    ```

- Add CSS prefixes for the `stretch` sizing value
([#&#8203;4184](https://redirect.github.com/evanw/esbuild/issues/4184))

This release adds support for prefixing CSS declarations such as `div {
width: stretch }`. That CSS is now transformed into this depending on
what the `--target=` setting includes:

    ```css
    div {
      width: -webkit-fill-available;
      width: -moz-available;
      width: stretch;
    }
    ```

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4zMy42IiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [rollup](https://rollupjs.org/)
([source](https://redirect.github.com/rollup/rollup)) | [`4.40.2` ->
`4.41.1`](https://renovatebot.com/diffs/npm/rollup/4.40.2/4.41.1) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/rollup/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rollup/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rollup/4.40.2/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rollup/4.40.2/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>rollup/rollup (rollup)</summary>

###
[`v4.41.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4411)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.41.0...v4.41.1)

*2025-05-24*

##### Bug Fixes

- If a plugin calls `this.resolve` with `skipSelf: true`, subsequent
calls when handling this by the same plugin with same parameters will
return `null` to avoid infinite recursions
([#&#8203;5945](https://redirect.github.com/rollup/rollup/issues/5945))

##### Pull Requests

- [#&#8203;5945](https://redirect.github.com/rollup/rollup/pull/5945):
Avoid recursively calling a plugin's resolveId hook with same id and
importer ([@&#8203;younggglcy](https://redirect.github.com/younggglcy),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5963](https://redirect.github.com/rollup/rollup/pull/5963):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5964](https://redirect.github.com/rollup/rollup/pull/5964):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.41.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4410)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.40.2...v4.41.0)

*2025-05-18*

##### Features

- Detect named exports in more dynamic import scenarios
([#&#8203;5954](https://redirect.github.com/rollup/rollup/issues/5954))

##### Pull Requests

- [#&#8203;5949](https://redirect.github.com/rollup/rollup/pull/5949):
ci: use node 24 ([@&#8203;btea](https://redirect.github.com/btea),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5951](https://redirect.github.com/rollup/rollup/pull/5951):
chore(deps): update dependency pretty-bytes to v7
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5952](https://redirect.github.com/rollup/rollup/pull/5952):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5953](https://redirect.github.com/rollup/rollup/pull/5953):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5954](https://redirect.github.com/rollup/rollup/pull/5954):
enhance tree-shaking for dynamic imports
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi),
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5957](https://redirect.github.com/rollup/rollup/pull/5957):
chore(deps): update dependency lint-staged to v16
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5958](https://redirect.github.com/rollup/rollup/pull/5958):
fix(deps): update rust crate swc_compiler_base to v20
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5959](https://redirect.github.com/rollup/rollup/pull/5959):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5960](https://redirect.github.com/rollup/rollup/pull/5960):
Use spawn to run CLI tests
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4zMy42IiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`50.6.14` ->
`50.7.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/50.6.14/50.7.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/50.6.14/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/50.6.14/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.7.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.7.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.17...v50.7.0)

##### Features

- **`getJsdocProcessorPlugin`:** add `allowedLanguagesToProcess` option
([#&#8203;1392](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1392))
([0adbf43](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/0adbf43b6b9f3e24422e100571ed66dd04f169be))

###
[`v50.6.17`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.17)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.16...v50.6.17)

##### Bug Fixes

- **`require-param`:** update jsdoccomment to support exported
TSFunctionType type; fixes
[#&#8203;1386](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1386)
([#&#8203;1389](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1389))
([e26a11a](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/e26a11a39930ebd07f61e509d91e6cb87f017dde))

###
[`v50.6.16`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.16)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.15...v50.6.16)

##### Bug Fixes

- **`valid-types`:** fix parsing of expressions like
`[@returns](https://redirect.github.com/returns)
{[@&#8203;link](https://redirect.github.com/link) SomeType}`; fixes
[#&#8203;1381](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1381)
([#&#8203;1382](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1382))
([2bd7242](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/2bd72429015352b383f5bfc22a937afaac4a3b48))

###
[`v50.6.15`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.15)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.14...v50.6.15)

##### Bug Fixes

- **`no-undefined-types`:** avoid eslint 8 error; fixes
[#&#8203;1387](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1387)
([#&#8203;1388](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1388))
([1bef636](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/1bef63677e385234a01316b6cfa9377023c10c15))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xNi4wIiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[rollup-plugin-dts](https://redirect.github.com/Swatinem/rollup-plugin-dts)
| [`6.1.1` ->
`6.2.1`](https://renovatebot.com/diffs/npm/rollup-plugin-dts/6.1.1/6.2.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/rollup-plugin-dts/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rollup-plugin-dts/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rollup-plugin-dts/6.1.1/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rollup-plugin-dts/6.1.1/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>Swatinem/rollup-plugin-dts (rollup-plugin-dts)</summary>

###
[`v6.2.1`](https://redirect.github.com/Swatinem/rollup-plugin-dts/compare/v6.2.0...v6.2.1)

[Compare
Source](https://redirect.github.com/Swatinem/rollup-plugin-dts/compare/v6.2.0...v6.2.1)

###
[`v6.2.0`](https://redirect.github.com/Swatinem/rollup-plugin-dts/blob/HEAD/CHANGELOG.md#620)

[Compare
Source](https://redirect.github.com/Swatinem/rollup-plugin-dts/compare/v6.1.1...v6.2.0)

**Features**:

-   Support importing json modules
-   Return Source Map Differences to Rollup

**Fixes**:

- Unable to find the program when entry points exist intersection
dependency
-   Create program for `imports` input file
-   Force emit types even when there's errors
-   Preserve type members of namespace in re-exported module
-   Imports and exports follows type-only
-   Import "local types" from "global modules"
-   Correctly restore type-only import/export names

**Thank you**:

Features, fixes and improvements in this release have been contributed
by:

-   [@&#8203;NWYLZW](https://redirect.github.com/NWYLZW)
-   [@&#8203;castarco](https://redirect.github.com/castarco)
-   [@&#8203;hyrious](https://redirect.github.com/hyrious)
-   [@&#8203;andersk](https://redirect.github.com/andersk)
-   [@&#8203;kricsleo](https://redirect.github.com/kricsleo)
-   [@&#8203;alan-agius4](https://redirect.github.com/alan-agius4)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
I missed a few workflows when I updated the node version. We should
update these for consistency.

Signed-off-by: Todd Baert <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`50.7.0` ->
`50.7.1`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/50.7.0/50.7.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/50.7.0/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/50.7.0/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.7.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.7.1)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.7.0...v50.7.1)

##### Bug Fixes

- revert are-docs-informative upgrade; fixes
[#&#8203;1393](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1393)
([#&#8203;1394](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1394))
([99cb131](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/99cb131ee40fa10f943aadfd73a6d18da082882f))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC40MC4zIiwidXBkYXRlZEluVmVyIjoiNDAuNDAuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Weyert de Boer <[email protected]>
🤖 I have created a release *beep* *boop*
---

##
[1.8.1](core-v1.8.0...core-v1.8.1)
(2025-06-04)

### 🔄 Refactoring

* **telemetry:** update telemetry attributes and remove unused
evaluation data
([#1189](#1189))
([3e6bcae](3e6bcae))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
Signed-off-by: Michael Beemer <[email protected]>
Signed-off-by: Weyert de Boer <[email protected]>
BREAKING CHANGE: Renamed `featureKey` prop to `flagKey` to avoid React key conflicts. Removed `negate` prop in favor of custom predicate functions.

- Rename `featureKey` prop to `flagKey` to prevent conflicts with React's reserved key prop
- Add optional `predicate` function prop for flexible custom matching logic
- Remove `negate` prop (negation can be handled via predicate functions)
- Improve type safety with generic types and FlagValue constraints
- Add default `equals` predicate function for standard equality matching
- Remove debug console.log statement
- Support truthy evaluation when no match value is provided

Signed-off-by: Weyert de Boer <[email protected]>
- Update tests to use new `flagKey` prop instead of `featureKey`
- Add comprehensive test coverage for custom predicate function
- Add tests for truthy/falsy flag evaluation without match values
- Fix string match test to use actual flag value instead of variant
- Improve type safety in test predicate functions

Signed-off-by: Weyert de Boer <[email protected]>
Update package-lock.json after dependency installation

Signed-off-by: Weyert de Boer <[email protected]>
@weyert weyert force-pushed the add-feature-flag-component branch from 340598d to 17d0c95 Compare July 20, 2025 17:11
@weyert
Copy link
Contributor Author

weyert commented Jul 20, 2025

Keep making a mess of git history when I need to fix DCO :(

The changes I made were:
b0fd0d7
c24b83f

I will see if I can fix the issue by merging main back into my branch

@aepfli
Copy link
Member

aepfli commented Jul 21, 2025

I will see if I can fix the issue by merging main back into my branch

a handy little git command which i like to use in this situations

git reset $(git merge-base upstream/main $(git branch --show-current))

it will reset the branch to upstream main, but will keep all the changes ready to be committed again. replace upstream/main with the reference branch of your desire ;)

@weyert
Copy link
Contributor Author

weyert commented Jul 21, 2025

@aepfli Thanks, I will try it out tomorrow. I might message you lol

weyert added 3 commits July 22, 2025 13:00
…nent

The fallback prop now accepts a function that receives EvaluationDetails<T> as an argument, providing more control over fallback rendering based on evaluation context.

BREAKING CHANGE: None - maintains backward compatibility with static React nodes

Signed-off-by: Weyert de Boer <[email protected]>
@weyert
Copy link
Contributor Author

weyert commented Jul 22, 2025

Your feedback should be addressed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants